unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Printers,WinSpool, StdCtrls;

type
  TPrinterInfo = record
    SeverName: PChar;
    PrinterName: PChar;
    ShareName: PChar;
    PortName: PChar;
    DriverName: PChar;
    Comment: PChar;
    Location: PChar;
    DeviceMode: PDeviceModeA;
    SepFile: PChar;
    PrintProcessor: PChar;
    DataType: PChar;
    Parameters: PChar;
    SecurityDescriptor: PSecurityDescriptor;
    Attributes: Cardinal;
    DefaultPriority: Cardinal;
    StartTime: Cardinal;
    UntilTime: Cardinal;
    Status: Cardinal;
    Jobs: Cardinal;
    AveragePPM: Cardinal;
  end;

  TFormMain = class(TForm)
    Memo1: TMemo;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}
function GetCurrentPrinterHandle(APrinterName : String): THandle;
var
  Device, Driver, Port: array[0..255] of char;
  hDeviceMode: THandle;
begin
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
//  if not OpenPrinter(@Device, Result, nil) then
//    RaiseLastWin32Error;

  if not OpenPrinter(PChar(APrinterName), Result, nil) then
    RaiseLastWin32Error;
end;
 
function GetCurrentPrinterInformation(APrinterName : String): TPrinterInfo;
var
  hPrinter: THandle;
  pInfo: PPrinterInfo2;
  bytesNeeded: DWORD;
begin
  hPrinter := GetCurrentPrinterHandle(APrinterName);
  try
    Winspool.GetPrinter(hPrinter, 2, Nil, 0, @bytesNeeded);
    pInfo := AllocMem(bytesNeeded);
    try
      Winspool.GetPrinter(hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded);
      Result.SeverName := pInfo^.pServerName;
      Result.PrinterName := pInfo^.pPrinterName;
      Result.ShareName := pInfo^.pShareName;
      Result.PortName := pInfo^.pPortName;
      Result.DriverName := pInfo^.pDriverName;
      Result.Comment := pInfo^.pComment;
      Result.Location := pInfo^.pLocation;
      Result.DeviceMode := pInfo^.pDevMode;
      Result.SepFile := pInfo^.pSepFile;
      Result.PrintProcessor := pInfo^.pPrintProcessor;
      Result.DataType := pInfo^.pDatatype;
      Result.Parameters := pInfo^.pParameters;
      Result.SecurityDescriptor := pInfo^.pSecurityDescriptor;
      Result.Attributes := pInfo^.Attributes;
      Result.DefaultPriority := pInfo^.DefaultPriority;
      Result.StartTime := pInfo^.StartTime;
      Result.UntilTime := pInfo^.UntilTime;
      Result.Status := pInfo^.Status;
      Result.Jobs := pInfo^.cJobs;
      Result.AveragePPM := pInfo^.AveragePPM;
    finally
      FreeMem(pInfo);
    end;
  finally
    ClosePrinter(hPrinter);
  end;
end;

function GetDefaultPrinter(DefaultPrinter: PChar; var I: Integer): BOOL; stdcall;
  external winspl name 'GetDefaultPrinterW';


procedure TFormMain.FormCreate(Sender: TObject);
begin
  ComboBox1.Items.Assign(Printer.Printers);
  ComboBox1.ItemIndex := 0;
  ComboBox1.OnChange(nil);
end;

procedure TFormMain.ComboBox1Change(Sender: TObject);
var
  PrinterInfo: TPrinterInfo;
begin
  PrinterInfo := GetCurrentPrinterInformation(ComboBox1.Text);
  memo1.Clear;
  with memo1.Lines do
  begin
    Add('GENERAL   INFORMATION');
    Add('');
    Add('ServerName:   ' + PrinterInfo.SeverName);
    Add('PrinterName:   ' + PrinterInfo.PrinterName);
    Add('ShareName:   ' + PrinterInfo.ShareName);
    Add('PortName:   ' + PrinterInfo.PortName);
    Add('DriverName:   ' + PrinterInfo.DriverName);
    Add('Comment:   ' + PrinterInfo.Comment);
    Add('Location:   ' + PrinterInfo.Location);
    Add('SepFile:   ' + PrinterInfo.SepFile);
    Add('PrintProcessor:   ' + PrinterInfo.PrintProcessor);
    Add('DataType:   ' + PrinterInfo.DataType);
    Add('Parameters:   ' + PrinterInfo.Parameters);
    Add('Attributes:   ' + IntToStr(PrinterInfo.Attributes));
    Add('DefaultPriority:   ' + IntToStr(PrinterInfo.DefaultPriority));
    Add('StartTime:   ' + IntToStr(PrinterInfo.StartTime));
    Add('UntilTime:   ' + IntToStr(PrinterInfo.UntilTime));
    Add('Status:   ' + '0x' + IntToHex(PrinterInfo.Status,8));
    Add('Jobs:   ' + IntToStr(PrinterInfo.Jobs));
    Add('AveragePPM:   ' + IntToStr(PrinterInfo.AveragePPM));
    Add('');
    Add('DEVICEMODE   INFORMATION');
    Add('');
 
    Add('DeviceName:   ' + PrinterInfo.DeviceMode.dmDeviceName);
    Add('SpecVersion:   ' + IntToStr(PrinterInfo.DeviceMode.dmSpecVersion));
    Add('DriverVersion:   ' + IntToStr(PrinterInfo.DeviceMode.dmDriverVersion));
    Add('Size:   ' + IntToStr(PrinterInfo.DeviceMode.dmSize));
    Add('DriverExtra:   ' + IntToStr(PrinterInfo.DeviceMode.dmDriverExtra));
    Add('Fields:   ' + IntToStr(PrinterInfo.DeviceMode.dmFields));
    Add('Orientation:   ' + IntToStr(PrinterInfo.DeviceMode.dmOrientation));
    Add('PaperSize:   ' + IntToStr(PrinterInfo.DeviceMode.dmPaperSize));
    Add('PaperLength:   ' + IntToStr(PrinterInfo.DeviceMode.dmPaperLength));
    Add('PaperWidth:   ' + IntToStr(PrinterInfo.DeviceMode.dmPaperWidth));
    Add('Scale:   ' + IntToStr(PrinterInfo.DeviceMode.dmScale));
    Add('Copies:   ' + IntToStr(PrinterInfo.DeviceMode.dmCopies));
    Add('DefaultSource:   ' + IntToStr(PrinterInfo.DeviceMode.dmDefaultSource));
    Add('PrintQuality:   ' + IntToStr(PrinterInfo.DeviceMode.dmPrintQuality));
    Add('Color:   ' + IntToStr(PrinterInfo.DeviceMode.dmColor));
    Add('Duplex:   ' + IntToStr(PrinterInfo.DeviceMode.dmDuplex));
    Add('YResolution:   ' + IntToStr(PrinterInfo.DeviceMode.dmYResolution));
    Add('TTOption:   ' + IntToStr(PrinterInfo.DeviceMode.dmTTOption));
    Add('Collate:   ' + IntToStr(PrinterInfo.DeviceMode.dmCollate));
    Add('LogPixels:   ' + IntToStr(PrinterInfo.DeviceMode.dmLogPixels));
    Add('BitsPerPel:   ' + IntToStr(PrinterInfo.DeviceMode.dmBitsPerPel));
    Add('PelsWidth:   ' + IntToStr(PrinterInfo.DeviceMode.dmPelsWidth));
    Add('PelsHeight:   ' + IntToStr(PrinterInfo.DeviceMode.dmPelsHeight));
    Add('DisplayFlags:   ' + IntToStr(PrinterInfo.DeviceMode.dmDisplayFlags));
    Add('DisplayFrequency:   ' + IntToStr(PrinterInfo.DeviceMode.dmDisplayFrequency));
    Add('ICMMethod:   ' + IntToStr(PrinterInfo.DeviceMode.dmICMMethod));
    Add('ICMintent:   ' + IntToStr(PrinterInfo.DeviceMode.dmICMIntent));
    Add('MediaType:   ' + IntToStr(PrinterInfo.DeviceMode.dmMediaType));
    Add('DitherType:   ' + IntToStr(PrinterInfo.DeviceMode.dmDitherType));
    Add('ICCManufacturer:   ' + IntToStr(PrinterInfo.DeviceMode.dmICCManufacturer));
    Add('ICCModel:   ' + IntToStr(PrinterInfo.DeviceMode.dmICCModel));
    Add('PanningWidth:   ' + IntToStr(PrinterInfo.DeviceMode.dmPanningWidth));
    Add('PanningHeight:   ' + IntToStr(PrinterInfo.DeviceMode.dmPanningHeight));

    Add('Status:   ' + '0x' + IntToHex(PrinterInfo.Status,8));
  end;

end;

end.
